package com.cskaoyan.javase.oop3._1interface._2notice;

/**
 * 接口定义和使用的注意事项:
 *      1.在Java8及其以后的版本中,接口中就允许定义实现方法了,不只限于定义抽象方法
 *          a.Java8接口中的默认实现方法
 *              语法:
 *              [public] default 返回值类型 方法名(形参列表){
 *                  // 方法体
 *              }
 *              注:
 *                  [public]表示默认实现方法默认被public修饰,访问权限不可更改,不用写出来
 *                  接口自身不能创建对象,它也不能直接调用默认实现方法,需要子类创建对象去调用
 *                  普通子类不需要强制实现默认实现方法
 *
 *                  默认实现方法,仅做了解,实际开发是很少见在接口中写默认实现方法的.
 *
 *          b.Java8接口中的静态实现方法
 *              语法:
 *              [public] static 返回值类型 方法名(形参列表){
 *                  // 方法体
 *              }
 *              注:
 *                  [public]表示默认实现方法默认被public修饰,访问权限不可更改,不用写出来
 *                  接口中静态方法可以直接使用接口名点调用
 *                  但是接口的静态方法,不能用接口实现类点调用
 *
 *       2.接口没有构造器,接口的子类,在子类对象初始化时,super指向谁?
 *          a.如果这个类没有直接继承某个类,那么super指向Object
 *          b.如果这个类继承了某个类,那么super就指向这个类.
 *
 *          3.接口有没有继承Object呢?
 *              首先讨论这个问题没有意义,因为接口的引用肯定要指向接口的实现类对象
 *              那么接口的实现类对象肯定是继承Object的
 *              但是如果真的要较真,接口实际上是实现了Object(了解)
 *
 *          4.接口的子类:
 *              a.普通类,必须要实现所有的抽象方法
 *              b.抽象类,不需要实现抽象方法
 *          5.总结一下,接口,抽象类,普通类之间的继承和实现
 *          首先是继承,注意继承是不能跨越种族的
 *              类和类继承
 *                  是单继承的
 *              接口和接口继承
 *                  接口是可以继承接口的,并且接口的继承是多继承的
 *
 *          接下来是实现
 *              只能是类实现接口
 *              接口不能实现类
 *
 *
 *
 * @since 17:04
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        IAImpl ia = new IAImpl();
        ia.test();
        ia.test2();
        IA.testStatic();

        Son.test();

        IA a;
        // a.

    }
}

interface IA {
    default void test() {
        System.out.println("666");
    }

    static void testStatic() {
        System.out.println("我是接口中的静态实现方法!");
    }
}

interface IB {
    default void test2() {
        System.out.println("777");
    }
}

class IAImpl extends A implements IA, IB {

}
interface IC extends IA,IB {
    void test();
}

abstract class BaseA implements IC{}
class A {
    int a;

}

class Father {
    static void test() {
    }

}

class Son extends Father {
}